package com.wang.designPattern.singleton;

import java.util.concurrent.atomic.AtomicReference;

/**
 * @description cas自旋单例
 * @Author wangzilong
 * @Date 2025/1/9 7:47
 */
public class CasSingleton {
    // 原子引用类型
    private static final AtomicReference<CasSingleton> INSTANCE = new AtomicReference<>();
    // 私有化构造
    private CasSingleton() {
    }
    // 公开化单例获取方法
    public static CasSingleton getInstance() {
        // 开启自旋
        for (;;) {
            // 获取原子引用中的单例对象
            CasSingleton instance = INSTANCE.get();
            // 如果单例对象已被创建，直接返回获取到的单例对象
            if (instance != null) {
                return instance;
            }
            // 如果原子引用单例对象未被初始化，则创建单例对象放进去
            instance = new CasSingleton();
            if (INSTANCE.compareAndSet(null, instance)) {
                return instance;
            }
        }
    }

}
